package cn.tedu.car.Spring中AOP拦截;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
*@author: 吴立涛
*@version 创建时间：2021-2-2820:44:56
*类说明：
*/
@Component  //让spring进行创建实例
@Aspect     //注解，此类切面类，切面定义，默认没有这个包

public class TimeAspect {
    //空方法，写切点表达式
	//切点，谁进行拦截，谁不进行拦截
	@Pointcut("execution(public * cn.tedu.car.service..*(..))")
	private void aopPointCut() {
		
	}
	
	/*通知：5种，前置通知pre，后置通知post，完成返回通知complete，异常通知，最强大环绕通知
	*@Around（空方法）
	*around方法（ProceedingJoinPoint必须是这个对象，它能获取被拦截对象，也能执行对象方法）
	*/
	//方法配置环绕通知，参数，Joinpoint连接点（拦截对象）
	@Around("aopPointCut()")
	public Object around(ProceedingJoinPoint sss) throws Throwable {
		long startTime=System.currentTimeMillis();
		
		Object rtn=sss.proceed(); //调用业务来回调invoke(aop可以获取被拦截对象，也能执行对象方法)
		
         long endTime=System.currentTimeMillis();
         
         String name=sss.getTarget().getClass().getName()   //被拦截的路径名.类名
        		 +sss.getSignature().getName();       //被拦截的方法名
         System.out.println("执行耗时:"+(endTime-startTime));
		
		return rtn; 
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}
